package com.company.genealogy.common.util;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 该工具类用于将中国省市区的JSON结构（如pcas-code.json）转换为region表的SQL插入语句。
 * 主要流程：
 * 1. 读取pcas-code.json文件，反序列化为Region对象列表。
 * 2. 递归遍历所有地区，生成对应的SQL插入语句。
 * 3. 将所有SQL语句写入region_init.sql文件。
 */
public class RegionJsonToSql {

    /**
     * 地区对象，包含地区编码、名称和下级地区列表
     */
    static class Region {
        public String code;           // 地区编码
        public String name;           // 地区名称
        public List<Region> children; // 下级地区
    }

    // 存放所有生成的SQL插入语句片段
    static List<String> sqlList = new ArrayList<>();
    // 生成当前时间字符串，作为created_at和updated_at字段
    static String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // 读取项目根目录下的pcas-code.json文件
        File jsonFile = new File("pcas-code.json");
        if (!jsonFile.exists()) {
            System.err.println("pcas-code.json 文件未找到，请将其放在项目根目录下。");
            return;
        }
        // 反序列化为省级Region对象列表
        List<Region> provinces = mapper.readValue(jsonFile, new TypeReference<List<Region>>() {});

        // 遍历每个省份，递归生成SQL
        for (Region province : provinces) {
            walk(province, null, 1);
        }

        // 输出所有SQL到region_init.sql文件
        File outFile = new File("region_init.sql");
        try (FileWriter writer = new FileWriter(outFile, false)) {
            writer.write("INSERT INTO tb_region (code, name, level, parent_code, sort_order, status, created_at, updated_at) VALUES\n");
            writer.write(String.join(",\n", sqlList));
            writer.write(";\n");
        } catch (IOException e) {
            System.err.println("写入 region_init.sql 文件失败: " + e.getMessage());
        }
    }

    /**
     * 递归遍历地区树，生成SQL插入语句
     * @param node 当前地区节点
     * @param parentCode 父级地区编码，顶级为null
     * @param level 地区级别（1-省，2-市，3-区县）
     */
    static void walk(Region node, String parentCode, int level) {
        String code = node.code;
        // 替换单引号，防止SQL语法错误
        String name = node.name.replace("'", "''");
        int sortOrder = 0; // 可根据需要调整排序
        int status = 1;    // 默认启用
        // 顶级节点parent_code为NULL，其余为父级编码
        String parent = (parentCode == null) ? "NULL" : "'" + parentCode + "'";
        // 组装SQL插入片段
        sqlList.add(String.format("('%s', '%s', %d, %s, %d, %d, '%s', '%s')",
                code, name, level, parent, sortOrder, status, now, now));
        // 递归处理下级地区
        if (node.children != null) {
            for (Region child : node.children) {
                walk(child, code, level + 1);
            }
        }
    }

} 